﻿// ReSharper disable StringLiteralTypo

namespace KinonekoSoftware.CodariaDB.Documents.Theories.Vocabulary
{
    public sealed class TheoryEngine_Vocabulary : TheoryEngine<Vocabulary>
    {
        private const string Object_Theory_Vocabularys   = "KinonekoSoftware.CodariaDB.Documents.Theories.Vocabularys.TheoryOfVocabularys";
        private const string Object_Theory_BuffAndDebuff = "KinonekoSoftware.CodariaDB.Documents.Theories.TheoryOfBuffAndDebuff";

        public void Add(Vocabulary element)
        {
            if (element is null)
            {
                return;
            }

            //
            //
            ((IGlossaryOperation)element).Add(this);

            //
            //
            InsideDB.Insert(element);
            InternalCollection.Add(element);
            Modified();
        }

        public void Update(Vocabulary element)
        {
            if (element is null)
            {
                return;
            }

            //
            //
            ((IGlossaryOperation)element).Update(this);

            //
            //
            InsideDB.Update(element);
            Modified();
        }
        
        public void Clear()
        {
            //
            //
            foreach (var element in InternalCollection)
            {
                //
                //
                ((IGlossaryOperation)element).Remove(this);
                
                //
                //
                InsideDB.Delete(element.Id);
                
                //
                //
                InternalCollection.Remove(element);
            }
            
            
            Modified();
        }

        public void Remove(Vocabulary element)
        {
            if (element is null)
            {
                return;
            }

            //
            //
            ((IGlossaryOperation)element).Remove(this);

            //
            //
            InsideDB.Delete(element.Id);
            InternalCollection.Remove(element);
            Modified();
        }

        private void Create(string name, string color, string intro = null)
        {
            Add(new Vocabulary
            {
                Id          = ID.Get(),
                Name        = name,
                Background  = $"#30{color}",
                BorderBrush = $"#{color}",
                Intro       = intro,
            });
        }

        protected override void OnInitialize()
        {
            //
            // BuffAndDebuff
            Create("破防", "888800", "破防效果能够破坏目标的护盾生成，根据数值大小可能会产生减少护盾生成数量、破坏护盾生成效果");
            Create("沉默", "DF8A2B", "会使得目标持续的沉默，短期内无法使用能力！");
            Create("禁锢", "7668ff", "会使得目标被禁锢在原地，可以使用无位移的能力，但无法进攻、移动");
            Create("眩晕", "20955b", "会使得目标短暂的眩晕");
            Create("挑衅", "4eddff", "会使得目标的关注点转移到另一个人身上，攻击、施法等行为都会优先转移到挑衅者身上，并且无法短期内接触");
            Create("亡语", "ffe48d", "亡语会在释放者死亡时施加到目标身上。");
            Create("减速", "888800", "会使得目标的身体机能受到影响，根据数值大小可能会产生降低攻击速度、降低移动速度、降低体能效果");
            Create("灼烧", "b9555b", "会使得目标持续的灼烧，同时会放大所有元素伤害！并减少来自友军的增益效果！");
            Create("重伤", "c765f3", "会使得目标的身体机能受到影响，大幅度减少各项数值，例如：攻击力、防御力、体力、回复比例。同时减少来自友军的增益效果");
            Create("诅咒", "ffe48d", "来自敌军的伤害会增加，来自友军的增益会减少");
            Create("流血", "e43218", "会使得目标持续的流血，并且无法获得满额的治疗效果。");
            Create("恐惧", "4eddff", "恐惧会使目标短暂失去冷却时间的加持，并且技能的加成将会大幅度降低！");
            Create("致盲", "7668ff", "致盲能够降低目标的命中率，根据数值大小可能会产生暴击未命中、攻击未命中效果");
            Create("疲劳", "4eddff", "疲劳会降低目标的各项属性，例如：攻击力、防御力、体力、回复比例");
            Create("贤者时间", "e43218", "贤者时间能够让目标失去冷却时间的加持，并提高目标的技能冷却时间！");
            Create("濒死", "888800", "濒死会大幅降低目标的所有回复能力，同时也可以大幅度减少来自其他人给予目标的回复");

            //
            // Vocabulary
            Create("物理攻击", "DF8A2B");
            Create("法术强度", "7668ff");
            Create("生命值", "20955b");
            Create("魔力值", "4eddff");
            Create("攻击速度", "ffe48d");
            Create("移动速度", "888800");
            Create("韧性", "888800");
            Create("体力", "888800");
            Create("护甲穿透", "b9555b");
            Create("魔法穿透", "c765f3");
            Create("物理吸血", "e43218");
            Create("法术吸血", "4eddff");
            Create("全能吸血", "7668ff");
            Create("物理防御", "888800");
            Create("魔法抗性", "4eddff");
            Create("暴击率", "e43218");
            Create("技能冷却", "888800");
            Create("生命值回复", "20955b");
            Create("法力值回复", "1899e6");
            Create("体力回复", "888800");
            Create("护盾大小", "20955b");
            Create("攻击距离", "ffe48d");
            Create("施法距离", "ffe48d");
        }

        public override string EngineID => EngineNames.Theory_Vocabulary;
        public override string GetCollectionName() => CollectionNames.Theory_VocabularyDB;
    }
}